﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CDSBDemandControl.Model;
using System.IO;
using System.Xml;
using System.Xml.Serialization;

namespace CDSBDemandControl.Configuration
{
    [Serializable]
    public class ConfigManager
    {
        private static string Path = @"D:\Ferramentas\CDSBDemandManager\XMLData\Configs\Config.xml";
        private static DateTime LastUpdate = DateTime.MinValue;
        private static DemandConfig XmlConfiguration;

        public static void Load()
        {        
            XmlSerializer Serializer = new XmlSerializer(typeof(DemandConfig));
            TextReader Reader = new StreamReader(Path);
            XmlConfiguration = (DemandConfig)Serializer.Deserialize(Reader);

            Reader.Close();
            Reader.Dispose();
            Serializer = null;
        }        

        public static DemandConfig GetXmlConfiguration()
        {
            if (LastUpdate.Date < File.GetLastWriteTime(Path).Date)
                Load();

            return XmlConfiguration;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public static string GetPeriodStartDate()
        {

            // Como o apuramento é mensal, pega o ano e o Mês e formata para o padrão YYYY-MM-DD 00:00:00
            return string.Format("{0}-{1}-{2} 00:00:00", DateTime.Now.Year, DateTime.Now.Month, 1);
        }

        /// <summary>
        /// Retorna o nome do Servidor do Team System
        /// </summary>
        /// <returns>String</returns>
        public static string GetServerName()
        {
            return GetXmlConfiguration().ServerName;


        }

        /// <summary>
        /// Retorna uma string com o endereço padrão para o Controle de Atividades da CDSB
        /// </summary>
        /// <returns>String</returns>
        public static string GetActiveControlUrL()
        {
            return GetXmlConfiguration().ActiveControlUrl;
        }

        /// <summary>
        /// Retorna uma string com o endereço padrão para a área de detalhes dos Items atrasados
        /// </summary>
        /// <returns>String</returns>
        public static string GetLateItemsURL()
        {
            return GetXmlConfiguration().LateItemsURL;
        }

        /// <summary>
        /// Retorna o nome do Gestor de Demanda da CDSB
        /// </summary>
        /// <returns>String</returns>
        public static string GetDemandManagerName()
        {
            return GetXmlConfiguration().DemandManagerName;
        }

        /// <summary>
        /// Retorna o caminho para o arquivo de Lock
        /// </summary>
        /// <returns>String</returns>
        public static string GetLockFilePath()
        {
            return GetXmlConfiguration().LockFilePath;
        }

        /// <summary>
        /// Retorna o caminho para o arquivo XML com os WI em Desenvolvimento
        /// </summary>
        /// <returns>String</returns>
        public static string GetWIPendingXMLPath()
        {
            return GetXmlConfiguration().WIPendingXMLPath;
        }

        /// <summary>
        /// Retorna o caminho para o arquivo XML com as solicitações do Site
        /// </summary>
        /// <returns></returns>
        public static string GetSolicitacoesSitesXMLPath()
        {
            return GetXmlConfiguration().GeraSolicitacoesSitesXMLPath;
        }

        /// <summary>
        /// Retorna o caminho para o arquivo XML com os WI em Desenvolvimento
        /// </summary>
        /// <returns>String</returns>
        public static string GetWIGeraDispXMLPath()
        {
            return GetXmlConfiguration().WIGeraDispXMLPath;
        }

        /// <summary>
        /// Retorna o caminho para o arquivo XML com os Bugs do Ultimo Mes
        /// </summary>
        /// <returns>String</returns>
        public static string GetBugsLastMonthXMLPath()
        {
            return GetXmlConfiguration().GeraBugsLastMonthXMLPath;
        }

        /// <summary>
        /// Retorna o caminho para o arquivo XML com os Bugs do Ultimo Mes
        /// </summary>
        /// <returns>String</returns>
        public static string GetPrevisaoAlocacaoXMLPath()
        {
            return GetXmlConfiguration().GeraPrevisaoAlocacaoXMLPath;
        }

        /// <summary>
        /// Retorna o caminho para o arquivo XML com a lista de ausencias
        /// </summary>
        /// <returns>String</returns>
        public static string GetAusenciasXMLPath()
        {
            return GetXmlConfiguration().GeraAusenciasXMLPath;
        }

        /// <summary>
        /// Retorna o caminho para o arquivo XML com todos os Work Items desenvolvidos no período
        /// </summary>
        /// <returns>String</returns>
        public static string GetAllWIPeriodXMLPath()
        {
            return GetXmlConfiguration().AllWIPeriodXMLPath;
        }

        /// <summary>
        /// Retorna o caminho para o arquivo XML com os WI atrasados
        /// </summary>
        /// <returns>String</returns>
        public static string GetWIOutOfDateXMLPath()
        {
            return GetXmlConfiguration().WIOutOfDateXMLPath;
        }

        /// <summary>
        /// Retorna o caminho para o arquivo XML com os WI que retornaram code Review
        /// </summary>
        /// <returns>String</returns>
        public static string GetWIWithCodeReviewXMLPath()
        {
            return GetXmlConfiguration().WIWithCodeReviewXMLPath;
        }

        /// <summary>
        /// Retorna uma lista com os status de workItem tratados pela CDSB;
        /// </summary>
        /// <returns>List of String</returns>
        public static List<string> GetStatusUnderDevelopment()
        {
            return GetXmlConfiguration().StatusUnderDevelopment;
        }

        /// <summary>
        /// Retorna uma lista com os team projects do projeto iMercado
        /// </summary>
        /// <returns>List of String</returns>
        public static List<string> GetTeamProjectsIMercado()
        {
            return GetXmlConfiguration().TeamProjectsIMercado;
        }

        /// <summary>
        /// Retorna uma lista com os team projects do projeto iMercado
        /// </summary>
        /// <returns>List of String</returns>
        public static List<string> GetTeamProjectsDataStorage()
        {
            return GetXmlConfiguration().TeamProjectsDataStorage;
        }

        /// <summary>
        /// Retorna uma lista com os team projects do projeto Sinacor
        /// </summary>
        /// <returns>List of String</returns>
        public static List<string> GetTeamProjectsSinacor()
        {
            return GetXmlConfiguration().TeamProjectsSinacor;
        }

        /// <summary>
        /// Retorna uma lista com os team projects do projeto Site BVMF
        /// </summary>
        /// <returns>List of String</returns>
        public static List<string> GetTeamProjectsSiteBVMF()
        {
            return GetXmlConfiguration().TeamProjectsSiteBVMF;
        }

        /// <summary>
        /// Retorna uma lista com os workItems que entram para o relatório de atrasos.
        /// </summary>
        /// <returns>List of String</returns>
        public static List<string> GetWorkItemsDeveloped()
        {
            return GetXmlConfiguration().WorkItemsDeveloped;
        }

        /// <summary>
        /// Retorna uma lista com os workItems tratados pela CDSB
        /// </summary>
        /// <returns>List of String</returns>
        public static List<string> GetWorkItemsUnderDevelopment()
        {
            return GetXmlConfiguration().WorkItemsUnderDevelopment;
        }

        /// <summary>
        /// Retorna uma Lista de Desenvolvedores
        /// </summary>
        /// <returns>List of DeveloperModel</returns>
        public static List<DeveloperModel> GetContributors()
        {
            return GetXmlConfiguration().Contributors;
        }

        /// <summary>
        /// Retorna o x tempo em que as consultas devem ser atualizadas
        /// </summary>
        /// <returns>int</returns>
        public static int GetMinutesToRefresh()
        {
            return GetXmlConfiguration().MinutesToRefresh;
        }

        /// <summary>
        /// Retorna o nome que aparecerá quando a task estiver na fila de um desenvolvedor
        /// </summary>
        /// <returns>string</returns>
        public static string GetPlannedStateName()
        {
            return GetXmlConfiguration().PlannedStateName;
        }

        /// <summary>
        /// Retorna o nome que aparecerá quando a task estiver na fila de um desenvolvedor
        /// </summary>
        /// <returns>string</returns>
        public static string GetPlannedReasonName()
        {
            return GetXmlConfiguration().PlannedReasonName;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public static List<string> GetStatusDeveloped()
        {
            return GetXmlConfiguration().StatusDeveloped;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public static string GetAttentionIcon()
        {
            return GetXmlConfiguration().AttentionIcon;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public static string GetErrorIcon()
        {
            return GetXmlConfiguration().ErrorIcon;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public static string GetOkIcon()
        {
            return GetXmlConfiguration().OKIcon;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public static string GetAttentionOBS()
        {
            return GetXmlConfiguration().AttentionOBS;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public static string GetErrorOBS()
        {
            return GetXmlConfiguration().ErrorOBS;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public static IEnumerable<DeveloperModel> GetDevelopers()
        {
            return from Developer in GetXmlConfiguration().Contributors where Developer.Mission == Mission.Developer select Developer;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public static List<string> GetAllowedUserBilling()
        {
            return GetXmlConfiguration().AllowedUserBilling;
        }

        /// <summary>
        /// Retorna Lista de feriados
        /// </summary>
        public static List<DateTime> GetFeriados()
        {
            return GetXmlConfiguration().Feriados;
        }

        public static CDSBNetWorkUser GetTFSUserAuthenticate()
        {
            return GetXmlConfiguration().TFSUserAuthenticate;
        }

        public static string GetManagementTeamTasksXMLPath()
        {
            return GetXmlConfiguration().GeraManagementTeamTasksXMLPath;
        }

        public static string GetWIScenariosAndTasksXMLPath()
        {
            return GetXmlConfiguration().GeraWIScenariosAndTasksXMLPath;
        }
    }
}
